isf 0.1.0

Parsing, Deserialization and Serialization of the Interactive Shader Format.
Documentation
float		PI_CONST = 3.14159265359;


//	with help from http://duriansoftware.com/joe/An-intro-to-modern-OpenGL.-Chapter-3:-3D-transformation-and-projection.html
//	and http://en.wikipedia.org/wiki/Rotation_matrix


mat4 view_frustum(
    float angle_of_view,
    float aspect_ratio,
    float z_near,
    float z_far
) {
    return mat4(
        vec4(1.0/tan(angle_of_view),           0.0, 0.0, 0.0),
        vec4(0.0, aspect_ratio/tan(angle_of_view),  0.0, 0.0),
        vec4(0.0, 0.0,    (z_far+z_near)/(z_far-z_near), 1.0),
        vec4(0.0, 0.0, -2.0*z_far*z_near/(z_far-z_near), 0.0)
    );
}

mat4 scale(float x, float y, float z)
{
    return mat4(
        vec4(x,   0.0, 0.0, 0.0),
        vec4(0.0, y,   0.0, 0.0),
        vec4(0.0, 0.0, z,   0.0),
        vec4(0.0, 0.0, 0.0, 1.0)
    );
}

mat4 translate(float x, float y, float z)
{
    return mat4(
        vec4(1.0, 0.0, 0.0, 0.0),
        vec4(0.0, 1.0, 0.0, 0.0),
        vec4(0.0, 0.0, 1.0, 0.0),
        vec4(x,   y,   z,   1.0)
    );
}

mat4 rotate_x(float theta)
{
    return mat4(
        vec4(1.0, 0.0, 0.0, 0.0),
        vec4(0.0, cos(theta*PI_CONST), sin(theta*PI_CONST), 0.0),
        vec4(0.0, -sin(theta*PI_CONST), cos(theta*PI_CONST), 0.0),
        vec4(0.0, 0.0, 0.0, 1.0)
    );
}

mat4 rotate_y(float theta)
{
    return mat4(
        vec4(cos(theta*PI_CONST), 0.0, sin(theta*PI_CONST), 0.0),
        vec4(0.0, 1.0, 0.0, 0.0),
        vec4(-sin(theta*PI_CONST), 0, cos(theta*PI_CONST), 0.0),
        vec4(0.0, 0.0, 0.0, 1.0)
    );
}

mat4 rotate_z(float theta)
{
    return mat4(
        vec4(cos(theta*PI_CONST), -sin(theta*PI_CONST), 0.0, 0.0),
        vec4(sin(theta*PI_CONST), cos(theta*PI_CONST), 0.0, 0.0),
        vec4(0.0, 0.0, 1.0, 0.0),
        vec4(0.0, 0.0, 0.0, 1.0)
    );
}

void main()
{
	isf_vertShaderInit();
	
	vec4 position = gl_Position;

    gl_Position = view_frustum(radians(45.0), RENDERSIZE.x/RENDERSIZE.y, 0.0, 2.0)
        * translate(0.0, 0.0, RENDERSIZE.x/RENDERSIZE.y)
        * rotate_x(-xrot)
        * rotate_y(yrot)
        * rotate_z(-zrot)
        * scale(zoom*RENDERSIZE.x/RENDERSIZE.y, zoom, zoom)
        * position;

}